- ORDINATEURS
- ORDINATEURSOn peut considérer que les tentatives d’automatisation des calculs remontent à quelques siècles, mais les véritables premiers ordinateurs n’ont été construits qu’à la fin de la Seconde Guerre mondiale.Outils universels par excellence, les ordinateurs ont envahi la vie courante et sont employés dans la plupart des activités humaines: industrie, commerce, recherche, enseignement, médecine, loisirs... Leur utilisation dans des domaines si variés découle de la souplesse introduite par la programmation [cf. PROGRAMMATION].Les ordinateurs ont connu des mutations successives, les générations , mais l’étude de ces différentes générations montre une continuité entre les ordinateurs les plus modernes et leurs ancêtres, les calculateurs.En fait, l’évolution de l’informatique peut s’expliquer par le désir d’exécuter de plus en plus vite un travail donné ou d’utiliser les ordinateurs pour des applications de plus en plus complexes. Cette généralisation de l’usage de l’outil informatique n’a été possible que grâce aux progrès technologiques réalisés à un rythme soutenu depuis les débuts de l’informatique.1. HistoriqueL’utilisation des ordinateurs repose sur le principe que tout calcul compliqué peut être décomposé en une suite d’opérations plus simples, susceptibles d’être exécutées automatiquement. Les premières machines à calculer, réalisées par Wilhelm Schickard, Pascal et Leibniz, remontent au début du XVIIe siècle. Elles effectuaient les opérations arithmétiques de base (additions et soustractions, mais également conversions de monnaie pour la machine de Pascal, les autres machines réalisant de plus multiplications et divisions).Au début du XIXe siècle, Charles Babbage (1792-1871) construisit une machine qui peut être considérée comme l’ancêtre des ordinateurs. Malheureusement, la machine de Babbage ne put jamais fonctionner de façon convenable, la technologie de l’époque étant trop rudimentaire.Il fallut attendre la fin du XIXe siècle et l’utilisation de l’électromécanique pour voir apparaître les machines mécanographiques. Très spécifiques d’un traitement donné (trieuses, tabulatrices, etc.), elles nécessitaient de nombreuses opérations manuelles, ce qui nuisait à leur rendement. En effet, tout traitement à effectuer par la machine était spécifié par un câblage, réalisé sur un tableau de connexions. Cette programmation pouvait prendre de quelques heures à plusieurs jours, selon la complexité du problème. Ultérieurement, les ordinateurs utilisant cette technique de programmation seront appelés machines à programme affiché .Peu avant la Seconde Guerre mondiale apparurent les premières calculatrices électromécaniques, construites selon les idées de Babbage. Ces machines furent vite supplantées par les premiers calculateurs électroniques, nettement plus performants. Le premier calculateur entièrement électronique, dénommé ENIAC (Electronic Numerical Integrator and Computer), fut construit en 1946 avec des tubes à vide. Comme les machines mécanographiques dont il découlait, l’ENIAC était une machine à programme affiché. Les inconvénients de cette technique de programmation conduisirent à la définition et à la réalisation de machines à programme enregistré , c’est-à-dire de machines dotées d’une mémoire capable de contenir à la fois les programmes et les données à traiter. La structure des machines à programme enregistré a été décrite en 1946 par un mathématicien américain d’origine allemande, John von Neumann. Cette architecture de machine est encore valable de nos jours, et la plupart des ordinateurs actuels s’en inspirent.L’architecture de von NeumannJohn von Neumann a proposé une structure universelle de machine à calculer et en a défini les constituants de base. La machine est composée des éléments suivants:– un organe de calcul, susceptible d’exécuter les opérations arithmétiques et logiques, l’unité arithmétique et logique ;– une mémoire , ou mémoire centrale , servant à la fois à contenir les programmes décrivant la façon d’arriver aux résultats et les données à traiter;– des organes d’entrée-sortie , ou périphériques , servant d’organes de communication avec l’environnement et avec l’homme;– une unité de commande (control unit ) permettant d’assurer un fonctionnement cohérent des éléments précédents.L’ensemble formé par l’unité arithmétique et logique, d’une part, et l’organe de commande, d’autre part, constitue l’unité centrale (ou processeur central ). L’ensemble des composants physiques, appelé matériel (hardware ), est commandé par un logiciel (software ). La figure 1 présente les relations qui existent entre les constituants de base de la machine de von Neumann.L’unité centrale ne peut effectuer qu’un ensemble restreint d’opérations élémentaires, spécifiées à l’aide d’instructions . L’ensemble des instructions exécutables constitue le jeu d’instructions ; celui-ci caractérise une architecture donnée.Une instruction est composée de plusieurs parties, les champs , parmi lesquels figurent principalement le code opération , définissant l’opération à exécuter, et l’adresse , précisant la localisation de l’opérande en mémoire.Les instructions de la machine décrite par von Neumann ne comportaient qu’une seule adresse, mais la plupart des machines ultérieures en eurent plusieurs: deux adresses (adresse du premier opérande, adresse du second opérande), voire trois (adresse du premier opérande, adresse du second opérande et adresse de rangement du résultat).Les différentes générations d’ordinateursSi les ordinateurs ont été conçus au départ pour exécuter des calculs numériques trop longs ou trop compliqués pour être effectués à la main, on s’est assez vite aperçu que de telles machines pouvaient également traiter des informations non numériques (par exemple, reconnaître une chaîne de caractères dans un texte). Les calculateurs devenaient des machines universelles de traitement de l’information, d’où le mot ordinateur , qui fut créé en 1956 pour trouver un équivalent français à l’expression anglaise data processing machine . Ce terme est aujourd’hui largement employé, et il est préféré à celui de calculateur, au sens trop restreint.Parallèlement à un spectaculaire accroissement des performances, on a assisté à une amélioration des techniques d’écriture des programmes, c’est-à-dire de la méthodologie de programmation. En général, aux progrès technologiques des générations d’ordinateurs correspondent peu ou prou des progrès réalisés au niveau des logiciels.La première génération (1950-1959)Les premières machines construites industriellement au tout début des années 1950 constituent bien évidemment la première génération d’ordinateurs. Ceux-ci se caractérisent par une technologie à base de tubes à vide miniaturisés, plus fiables et consommant moins d’énergie que ceux qui étaient utilisés dans les premiers prototypes. Une fois résolus les problèmes de fiabilité des constituants de l’unité centrale, on chercha rapidement à disposer de mémoires centrales fiables, rapides et de capacités suffisantes. Les mémoires des premiers ordinateurs furent des lignes à retard offrant, à volume égal, une capacité de stockage très supérieure aux tubes à vide. Mais, en quelques années, les mémoires à tores de ferrite supplantèrent les autres technologies de mémoires centrales.Parallèlement aux travaux visant à l’amélioration des mémoires centrales, des recherches furent entreprises sur les organes d’entrée-sortie, notamment pour mettre au point des supports d’information moins coûteux que les mémoires à tores. Ces mémoires secondaires (on parle également de mémoires externes , de mémoires auxiliaires , de mémoires de masse ) devaient permettre le stockage d’une quantité d’informations toujours plus grande, pour des traitements de plus en plus complexes. C’est ainsi qu’apparurent tambours magnétiques, bandes magnétiques, disques... Ces supports d’information, encore utilisés (sauf les tambours magnétiques), ont été constamment améliorés depuis leur création.Pendant cette décennie, les logiciels évoluèrent de façon significative: on améliora les langages de programmation disponibles, ainsi que les techniques de gestion des différents types de mémoires utilisées dans un ordinateur.Amélioration des langages de programmationLes langages de programmation des premières machines étaient rudimentaires, la programmation se faisant en représentation binaire, instruction par instruction. Cette programmation, lente et fastidieuse, était source de nombreuses erreurs. En outre, elle est quasi inutilisable dès que le programme devient complexe. On développa donc des langages de programmation plus commodes à employer, les langages d’assemblage et les langages évolués.Les langages d’assemblage ont permis l’écriture des instructions du langage machine sous forme symbolique; la traduction en binaire est assurée par un programme, fourni par le constructeur, appelé assembleur .Les langages évolués permettent à l’utilisateur de décrire le traitement à effectuer, indépendamment du jeu d’instructions de la machine. Les programmes, écrits en langage source (le langage de programmation utilisé), sont traduits soit en une suite d’instructions du langage machine, soit dans un langage intermédiaire , plus proche du langage machine que le langage source. Les programmes traducteurs, appelés compilateurs , sont d’autant plus complexes que les langages sources sont éloignés du langage objet (le langage dans lequel est traduit le langage source). Le premier des langages évolués, Fortran, apparut en 1954 et fut conçu pour l’écriture des programmes scientifiques. Après quelques modifications rendues nécessaires par l’évolution des ordinateurs, Fortran est encore employé sur les puissants ordinateurs scientifiques modernes.Hiérarchie de mémoiresDans une machine de von Neumann, la mémoire centrale sert à stocker à la fois les programmes et les données. Rapidement, il fut impossible de conserver dans une seule mémoire toutes ces informations, d’où la nécessité d’augmenter les capacités de stockage de la machine avec des mémoires secondaires. Celles-ci possèdent des capacités de stockage très supérieures aux mémoires centrales, mais leur temps d’accès (temps au bout duquel une information est disponible) est beaucoup plus important. La disparité des temps d’accès des différents types de mémoires a imposé une hiérarchisation des informations, les plus prioritaires (ou le plus souvent utilisées) se trouvant dans les mémoires les plus rapides. Cette contrainte a considérablement compliqué la gestion des ressources de la machine, et l’on vit apparaître les premiers moniteurs , programmes gérant les ressources de la machine et commandant automatiquement l’exécution des entrées d’informations, le déroulement du traitement et la sortie des résultats d’un programme.La deuxième génération (1959-1963)De nos jours, il est admis que l’apparition de la deuxième génération coïncide avec l’utilisation des transistors dans les unités centrales. L’utilisation de cette technologie entraîna une amélioration des vitesses de traitement et des débits des ordinateurs. Une conséquence importante en fut l’aggravation des écarts de vitesses entre le traitement proprement dit et les entrées-sorties. Depuis cette époque, cet écart n’a cessé de croître, et il demeure un facteur de limitation des performances des machines. L’utilisation des transistors provoqua également la miniaturisation des unités centrales et une diminution importante de l’énergie consommée par les machines. La deuxième génération peut également être considérée comme l’époque de progrès très importants dans le domaine des logiciels, puisque la plupart des concepts développés alors restent valables sur les ordinateurs actuels.Améliorations des matériels de deuxième générationDans un ordinateur, l’exécution du programme peut dépendre de conditions d’exception (par exemple, attente d’une donnée provenant d’un périphérique). Ces événements surgissent à des instants imprévisibles et doivent être traités dès leur arrivée. Dans les ordinateurs de première génération, la plupart de ces événements exigeaient une intervention humaine et donc provoquaient l’arrêt de la machine. Une des premières améliorations apportées par la deuxième génération fut d’inclure dans le matériel la possibilité de prise en compte d’événements extérieurs au programme (les interruptions ). Cette modification permit une gestion automatique des événements (externes et internes à la machine) et contribua à une augmentation sensible des performances des machines en diminuant les temps d’attente de l’unité centrale. Toutefois, des progrès décisifs ne furent réalisés qu’avec l’apparition des canaux , véritables processeurs spécialisés dans le traitement des entrées-sorties, permettant l’exécution simultanée du programme de traitement et du programme de gestion des entrées-sorties. En effet, malgré l’accroissement des performances des périphériques, l’unité centrale restait encore largement sous-utilisée. Les canaux permirent de décharger l’unité centrale des tâches de gestion du transfert des données entre périphériques et mémoire centrale: une fois l’opération d’entrée-sortie initialisée par l’unité centrale, le transfert des données relatif à cette opération se déroule sous le seul contrôle du canal. Encore embryonnaires au cours de la deuxième génération, les canaux seront considérablement améliorés dans la génération suivante. Ces progrès des matériels de deuxième génération entraînèrent une modification profonde des logiciels mis en œuvre.Les concepts logiciels introduits dans la deuxième générationPour tirer parti des nouveaux dispositifs matériels, de nouveaux logiciels s’avéraient indispensables. Tout d’abord, la gestion des périphériques s’alourdissant, il devint impossible pour un programmeur de concevoir à la fois les logiciels d’application et les logiciels de gestion de la machine. Une distinction s’établit donc entre les applications (programmes de l’utilisateur) et les programmes système (logiciel de gestion des ressources de la machine).Dans une première étape, les logiciels système des machines de deuxième génération étaient composés de programmes de gestion des entrées-sorties (Input Output Control System, ou IOCS), qui affranchirent les programmeurs des lourdes contraintes de gestion des périphériques. Les IOCS permettaient donc une simultanéité apparente entre l’unique programme utilisateur et la gestion des entrées-sorties. Malgré cela, à cause des disparités de vitesses mentionnées plus haut, l’unité centrale restait sous-employée. De plus, le passage d’un programme à un autre nécessitait une intervention humaine. Les moniteurs d’enchaînement permirent de supprimer cette opération manuelle en assurant l’enchaînement automatique des applications. Avec ce type de système, les programmes (ou travaux) à exécuter étaient placés les uns derrière les autres, chaque travail et ses jeux de données constituant un lot , qui ne pouvait s’exécuter avant la fin du lot précédent. Ce mode de fonctionnement, dénommé traitement par lots (batch processing ), minimisait les interventions manuelles et, dès la fin de la première génération, la quasi-totalité des ordinateurs fonctionnaient dans ce mode. En ce qui concerne les logiciels, l’innovation principale de la deuxième génération fut la multiprogrammation , qui remédia à la sous-utilisation chronique de l’unité centrale.Lorsque l’ordinateur fonctionne en multiprogrammation, plusieurs applications sont chargées en mémoire et «se partagent» le processeur. Dès que se manifeste une attente dans l’exécution du programme en cours (demande d’entrée-sortie, par exemple), le processeur abandonne l’exécution de ce programme et démarre (ou poursuit) l’exécution d’un autre programme. Ce dernier est alors exécuté jusqu’à sa fin ou jusqu’à ce qu’il demande une entrée-sortie.En autorisant l’exécution pseudo-simultanée de plusieurs programmes, la multiprogrammation entraîna un accroissement considérable de la complexité des logiciels systèmes, les IOCS ne constituant plus qu’une partie des systèmes d’exploitation des ordinateurs (operating systems ). En effet, de nombreuses opérations et vérifications, inutiles avec des machines mono-utilisateur, devenaient indispensables sur des machines multi-utilisateurs: décision d’allouer l’unité centrale à un travail donné, contrôle de l’exécution des programmes, transferts des programmes à exécuter des mémoires secondaires en mémoire centrale (swapping ), transferts des programmes inactifs de la mémoire principale vers les mémoires secondaires, mécanismes de protection des programmes contre les erreurs des autres programmes, etc.L’étape suivante, le temps partagé (time sharing ), permit aux utilisateurs de retrouver l’accès direct aux ordinateurs, qu’ils avaient perdu sur les machines à traitement par lots. Chaque utilisateur du système se voit alloué périodiquement le processeur, pendant un laps de temps déterminé. Pour un utilisateur, la fréquence d’allocation du processeur est suffisamment élevée pour lui donner l’illusion d’être seul à travailler sur la machine. L’accès à l’ordinateur s’effectue le plus souvent au moyen de terminaux (d’abord des machines à écrire connectées puis, plus tard, des ensembles clavier-écran); l’utilisation intensive des terminaux est un trait dominant des systèmes de troisième génération.Un autre type de système, les systèmes temps réel , apparut également à cette époque. Ces systèmes très particuliers ont été conçus pour piloter des processus industriels. Ces systèmes doivent réagir aux événements en un temps borné supérieurement. Les interruptions correspondent à des événements spécifiques du processus à piloter et provoquent l’exécution du programme de gestion de l’événement correspondant.La troisième générationLes progrès constatés dans la troisième génération ont été rendus possibles par un accroissement de la puissance de traitement et une augmentation spectaculaire des capacités des mémoires (centrales et secondaires). Ces progrès dépendent eux-mêmes de ceux qui sont réalisés dans l’intégration des composants électroniques. L’ensemble des composants électroniques implantés sur un même morceau de silicium est appelé circuit intégré . La densité d’intégration correspond au rapport entre le nombre de composants et la surface de silicium occupée, pour une technologie de fabrication donnée.L’utilisation des techniques de microprogrammation (cf. infra , Principes de fonctionnement d’un processeur classique ) dans le matériel des ordinateurs de troisième génération a facilité l’implantation d’un même jeu d’instructions sur des machines de puissances différentes, pour constituer des gammes de machines compatibles entre elles d’un point de vue logiciel.Les systèmes d’exploitation ont continué à se compliquer et les applications à proliférer. Désormais, les utilisateurs non informaticiens peuvent accéder à des données et utiliser des services par l’intermédiaire d’applications spécifiques (par exemple, pour réserver une place d’avion, consulter la position du compte bancaire d’un client, etc.).En fait, la troisième génération se caractérise plus par une évolution continue, une amélioration incessante des matériels et des logiciels, que par une remise en cause des architectures des générations précédentes. À mesure que l’utilisation des ordinateurs et des services qu’ils peuvent offrir est de plus en plus intensive, les systèmes d’exploitation et les applications sont devenus de plus en plus complexes et volumineux.Les systèmes des années 1970 ont permis aux utilisateurs d’accéder aux machines à distance: par l’intermédiaire de terminaux reliés à ces machines par des liaisons téléphoniques, l’utilisateur éloigné pouvait soumettre des lots de travaux ou encore utiliser le temps partagé. Les systèmes d’exploitationprésentaient de profondes différences d’un constructeur à l’autre, voire d’une machine à l’autre chez un même constructeur.La quatrième génération?Vers la fin des années 1970, les coûts des logiciels occupent désormais une part prépondérante dans le prix de revient des systèmes informatiques, alors que jusqu’ici les matériels représentaient la majeure partie des investissements. Les utilisateurs ont de plus en plus le souci de protéger leurs investissements logiciels et redoutent les changements de machines entraînant une réécriture des programmes. La compatibilité des machines vis-à-vis des programmes existants devient un impératif majeur des utilisateurs et s’oppose aux changements radicaux de matériels, tels qu’on les avait connus aux débuts de l’informatique. Les constructeurs ont dû se plier à cette exigence.Les progrès technologiques impressionnants, commencés dans les années 1970 (doublement tous les deux ans environ de la densité d’intégration), ont rendu possible la mise en œuvre de concepts architecturaux déjà connus mais qui n’avaient pu être implantés, à cause des difficultés techniques et du coût exorbitant de telles réalisations. L’accroissement de la densité d’intégration à partir des circuits MSI (Medium Scale Integration), puis LSI (Large Scale Integration) et enfin VLSI (Very Large Scale Integration) a conditionné le développement des architectures de machines scientifiques extrêmement puissantes (cf. infra , Les améliorations possibles de l’architecture de von Neumann ), l’émergence des premiers microprocesseurs (processeurs dont les organes furent intégrés dans un ou plusieurs circuits), ainsi que l’apparition de mémoires centrales de fortes capacités à faibles coûts. Parallèlement, les périphériques ont également bénéficié de ces progrès et se font de plus en plus rapides et de plus en plus compacts, tout en devenant moins onéreux. L’apparition des microprocesseurs et des mémoires à faibles coûts marque l’avènement des ordinateurs personnels , ou micro-ordinateurs , et des stations de travail , qui ont rendu l’informatique omniprésente dans tous les secteurs d’activité. Les micro-ordinateurs ont assez rapidement atteint la puissance des gros ordinateurs du début des années 1970, pour un encombrement très faible et un coût dérisoire, comparé au prix des machines de cette époque. Les stations de travail, à usage professionnel, sont des machines puissantes sous un faible volume, orientées vers les applications graphiques.L’existence d’une quatrième génération peut donc être considérée comme problématique pour qualifier les ordinateurs à partir des années 1980, puisqu’il y a continuité dans les architectures de machines. Les améliorations auxquelles on assiste depuis lors sont essentiellement dues aux progrès continus réalisés dans l’intégration des composants. Toutefois, s’il subsiste toujours de profondes différences entre les divers systèmes d’exploitation, les tendances actuelles de l’informatique concourent à gommer les incompatibilités entre les différents systèmes.Améliorations de l’outil informatiqueDu fait de l’utilisation croissante de l’outil informatique, il devenait essentiel de rendre son accès plus aisé, aussi bien pour les concepteurs de nouvelles applications (développeurs ) que pour les utilisateurs de ces applications. Par ailleurs, des outils d’assistance technique aux utilisateurs dans un domaine de compétences très précis (aide au diagnostic médical, recherche de nappes pétrolifères, etc.) ont été développés. Pour améliorer la productivité des uns et des autres, il est devenu nécessaire de mettre en commun les ressources logicielles et matérielles des différents systèmes. Ces améliorations correspondent respectivement aux langages de quatrième génération , aux systèmes experts et à l’interconnexion des machines .Les langages de quatrième générationCes langages de très haut niveau intègrent dans un même produit des facilités qui sont habituellement réparties dans plusieurs logiciels distincts. Les langages de quatrième génération ne comportent en général que peu d’instructions mais procèdent, pour réaliser une fonction déterminée, par appel à des programmes déjà écrits. Leur principal intérêt est de permettre l’écriture d’applications plus rapidement qu’avec des méthodes classiques de programmation. Ces langages peuvent même être utilisés par les spécialistes d’un domaine d’applications (gestion, etc.) ne disposant pas forcément de connaissances poussées en informatique.Les systèmes expertsLes systèmes experts s’efforcent, dans un domaine précis, de reproduire le comportement d’un expert humain. Ces produits sont issus des recherches en intelligence artificielle. La réalisation d’un système expert est possible si l’on peut décrire le comportement de l’expert humain à l’aide de «règles», agissant sur une base de données contenant les «faits». Pour établir un diagnostic, le système expert dirige pas à pas l’utilisateur en lui demandant des précisions sur le phénomène observé. Il peut également justifier, à la demande de l’utilisateur, la démarche qu’il a suivie pour aboutir à l’état actuel du système.Interconnexion des machines et partage des ressourcesDans le courant des années 1970, les réseaux informatiques étaient constitués autour de puissants ordinateurs centraux (les mainframes ou sites centraux ), contenant les applications et les données, auxquels les terminaux étaient raccordés par des liaisons téléphoniques (spécialisées ou réseau commuté). L’architecture de ces systèmes de communication se caractérisait par la place prépondérante du site central (contrôlant l’ensemble des ressources matérielles et logicielles), les utilisateurs accédant aux services et aux données par des terminaux passifs. Avec le développement des micro-ordinateurs, ces nouveaux utilisateurs désirèrent très vite accéder également aux services disponibles sur les sites centraux. Pour cela, des matériels et des logiciels spécifiques (les émulateurs de terminaux ) leur permirent de fonctionner comme des terminaux. Toutefois, pendant la session avec le site central, le micro-ordinateur perdait ses capacités propres de traitement des données.Les années 1980 coïncident avec le développement considérable du parc de micro-ordinateurs. Les utilisateurs souhaitent mettre en commun les ressources de leurs machines, tant matérielles (imprimantes laser, etc.) que logicielles (applications, etc.). Apparaissent alors les réseaux locaux ou LAN (Local Area Networks), par opposition aux précédents réseaux, dits réseaux grande distance ou WAN (Wide Area Networks).Les réseaux locaux diffèrent des précédents aussi bien par les débits offerts (plusieurs millions de bits par seconde au lieu de quelques dizaines de kilobits par seconde) que par la manière de les utiliser (les micro-ordinateurs exploitent leurs capacités de traitement et de stockage des données). Désormais, tout ordinateur appartenant à un réseau peut proposer des services comme serveur et/ou utiliser les services d’autres systèmes en tant que client. Le modèle client-serveur a permis l’émergence de nouvelles techniques de travail et une coopération d’égal à égal entre micro-ordinateurs, stations de travail et sites centraux.Par ailleurs, l’interconnexion des systèmes informatiques a fait l’objet de normalisations internationales. Celles-ci ont pour but d’offrir aux utilisateurs l’accès à un système quelconque, indépendamment de son constructeur et de sa localisation géographique. Les constructeurs s’efforcent de proposer des protocoles de communication qui répondent à ce besoin d’interconnexion, tout en préservant les spécificités des architectures de communication propriétaires qu’ils ont élaborées précédemment dans les années 1970.2. Principes de fonctionnement d’un processeur classiqueLe matériel d’un processeur est prévu pour effectuer toutes ses opérations en binaire, c’est-à-dire que programmes et données sont codés dans la machine sous forme de suites de 0 et de 1 (les bits). Le matériel est composé d’un ensemble d’organes et d’opérateurs de base dont l’agencement est spécifique d’une architecture donnée. Il importe donc de connaître les constituants de base d’un ordinateur avant d’en analyser le fonctionnement.Les constituants de baseBasculeUne bascule permet de mémoriser une quantité d’information d’un bit. Elle possède une entrée d’information, une commande et une sortie. L’entrée de commande permet de mémoriser dans la bascule l’état de l’entrée d’information; la sortie reflète l’état interne de la bascule.RegistreUn registre est composé de n bascules, permettant de mémoriser un élément d’information de n bits. Le registre possède donc n entrées et n sorties, mais une seule entrée de commande pour l’ensemble des bascules. L’entrée de commande permet de déclencher la mémorisation de l’état des n entrées dans le registre.MémoireUne mémoire est un ensemble de cases identiques, chacune d’elles pouvant mémoriser un élément d’information. Chaque case mémoire (ou mot mémoire ) est désignée par son numéro, l’adresse .Une mémoire est caractérisée par deux grandeurs indépendantes l’une de l’autre: sa capacité , correspondant au nombre de mots, sa longueur de mot , dont les valeurs courantes sont 8, 16, 32 et 64 bits.Sur un mot mémoire désigné par la valeur de l’adresse, deux opérations peuvent être effectuées: une lecture (consultation du contenu d’une case, sans modification de l’information qu’elle contient) et une écriture (remplacement du contenu d’une case, l’ancien contenu étant perdu).Une mémoire possède des entrées d’adresse, des entrées et sorties d’informations (souvent confondues), ainsi qu’une entrée de commande définissant l’opération à effectuer (lecture ou écriture).Le temps d’accès d’une mémoire est l’intervalle de temps séparant la désignation d’un mot mémoire (positionnement de l’adresse) de la disponibilité de son contenu sur les sorties lors d’une opération de lecture.Liaisons et busLes liaisons relient entre eux les constituants de base précédents et permettent ainsi des déplacements d’information d’un point à un autre du processeur. Par exemple, pour transférer dans un registre D de n bits l’élément d’information contenu dans un registre E de n bits, il faut que chaque entrée du registre D soit reliée directement à la sortie correspondante du registre E. Le registre E est l’émetteur, le registre D le récepteur.Un bus est un type de liaison permettant de relier plusieurs émetteurs à un même récepteur; il possède un mécanisme permettant de choisir l’émetteur à l’aide d’entrées de commande.Unité arithmétique et logiqueUne unité arithmétique et logique permet de combiner deux opérandes de n bits pour obtenir un résultat sur n bits. Cette unité comporte deux groupes d’entrées de n bits correspondant aux opérandes et n sorties correspondant au résultat. Des entrées de commandes définissent l’opération à effectuer sur les opérandes (addition, soustraction, multiplication, division, décalage, et bit à bit, etc.). Des sorties supplémentaires (drapeaux ou indicateurs) caractérisent le résultat: par exemple, après une addition, on peut ainsi savoir si le résultat est nul, positif ou négatif, en consultant ces indicateurs.Structure d’un processeurUn processeur est un ensemble matériel capable d’exécuter, de façon autonome, une suite d’instructions représentant un traitement d’informations. Il est connecté à une mémoire contenant les instructions et les données à traiter. Le processeur se compose de deux parties, un chemin de données (datapath ), dans lequel s’effectue le traitement des informations, et un organe de commande pilotant le chemin de données.Chemin de donnéesL’association des constituants de base (unité arithmétique et logique, registres interconnectés à l’aide de bus et de liaisons) est appelée le chemin de données . Celui-ci est relié à la mémoire par des liaisons d’adresses et de données.La figure 2 montre un exemple simplifié de chemin de données, dans lequel l’unité arithmétique et logique ne peut effectuer que les opérations d’addition et de soustraction. La sortie R de l’unité arithmétique et logique représente l’état de la retenue; la sortie Z indique si le résultat de l’opération est nul. Le bus X permet d’amener le contenu du registre A ou celui du registre B vers l’entrée X de l’unité arithmétique et logique. Le bus Y permet d’amener le contenu du registre AD ou celui d’un mot mémoire vers l’entrée Y de l’unité arithmétique et logique. La sortie T de cette dernière est reliée aux entrées des registres A, B, AD et à l’entrée de la mémoire MEM par la liaison T.Le mot mémoire utilisé à un instant donné est défini par le contenu du registre AD, le registre adresse mémoire.Les commandes associées aux constituants de base sont représentées par de petites flèches. Ainsi EA représente la commande permettant de mémoriser dans le registre A le résultat fourni par l’unité arithmétique et logique; A vers X représente la commande du bus X permettant d’amener le contenu du registre A vers l’entrée X de l’unité arithmétique et logique; X + Y représente la commande de l’unité arithmétique et logique permettant d’effectuer l’addition des deux opérandes.Le chemin de données permet d’effectuer des opérations telles que: «prendre le contenu du registre A, lui ajouter le contenu d’un mot mémoire, puis ranger le résultat dans le registre B».Notions de transfert élémentaire et de cycle de base. Un transfert élémentaire est défini comme le déplacement d’un élément d’information ayant pour origine un registre ou un mot mémoire et pour destination un registre ou un mot mémoire. L’élément d’information transféré peut éventuellement être modifié lors de son passage dans l’unité arithmétique et logique. L’exécution de chaque instruction est décomposée en une suite de transferts élémentaires.Un cycle de base correspond à l’intervalle de temps nécessaire à l’exécution d’un transfert élémentaire ayant pour origine un registre et pour destination un registre. Ainsi, le transfert élémentaire «prendre le contenu du registre A, lui ajouter le contenu du registre AD, puis ranger le résultat dans le registre B» peut s’effectuer en un cycle de base. Pour cela, il faut que les commandes du chemin de donnée A vers X, AD vers Y, X + Y et EB soient activées pendant le cycle.Dans la plupart des cas, le temps d’accès d’une mémoire est supérieur au cycle de base. Un transfert élémentaire utilisant le contenu d’un mot mémoire s’étalera donc sur plusieurs cycles de base.Organe de commandeL’organe de commande spécifie et coordonne, à l’aide de commandes, la suite des transferts élémentaires que doit effectuer le chemin de données à chaque cycle de base, pour exécuter l’instruction courante. L’organe de commande possède une représentation de la suite des commandes nécessaires à l’exécution de chaque instruction. Selon sa complexité, une instruction peut être exécutée en un ou plusieurs cycles de base.La figure 3 décrit les relations entre l’organe de commande et le chemin de données. Pendant chaque cycle de base, les commandes issues de l’organe de commande définissent un ou plusieurs transferts élémentaires dans le chemin de données. Ce dernier fournit en retour des états (par exemple, la valeur des indicateurs de l’unité arithmétique et logique, le code opération de l’instruction), qui sont exploités par l’organe de commande et lui permettent de choisir les nouvelles commandes à envoyer au chemin de données pendant le cycle de base suivant.Microprogrammation . C’est une des techniques de réalisation de l’organe de commande. Elle consiste à utiliser une mémoire de commande , propre à l’organe de commande, dans laquelle sont stockées les différentes combinaisons de commandes élémentaires. Une micro-instruction représente les commandes activées pendant un cycle de base. Chaque micro-instruction est stockée dans un mot de la mémoire de commande, et son contenu est fixé au moment de la construction de l’organe de commande. L’ensemble des micro-instructions (le microprogramme ) constitue la suite des commandes nécessaires à l’exécution du jeu d’instructions du processeur. La microprogrammation permet de réaliser un jeu d’instructions aussi complexe que l’on veut.L’organe de commande d’une machine microprogrammée comporte trois parties: une mémoire contenant les micro-instructions, un séquenceur réalisant l’enchaînement des micro-instructions, une horloge représentant la référence de temps.On voit sur la figure 4 qu’une micro-instruction comporte deux parties: les commandes destinées au chemin de données et une partie enchaînement destinée au séquenceur. Cette dernière partie indique au séquenceur comment il doit élaborer l’adresse de la micro-instruction suivante.Exécution d’une instructionLe processeur exécute séquentiellement une suite d’instructions. La position en mémoire de l’instruction à exécuter est donnée par le contenu d’un registre du chemin de données, le compteur ordinal ou compteur de programme . Le contenu de ce registre est mis à jour durant l’exécution de chaque instruction. L’exécution d’une instruction par l’organe de commande comporte les quatre étapes suivantes:– lire l’instruction dont l’adresse est contenue dans le compteur ordinal et la charger dans le registre instruction ;– mettre à jour le compteur ordinal de façon à ce qu’il contienne l’adresse de la prochaine instruction à exécuter;– décoder l’instruction contenue dans le registre instruction pour connaître sa signification;– effectuer les opérations élémentaires correspondant à l’instruction décodée.À la fin de la quatrième étape, il suffit de revenir à la première pour passer à l’exécution de l’instruction suivante.3. Les améliorations possibles de l’architecture de von NeumannLes performances des ordinateurs ont connu une progression spectaculaire puisque les vitesses de calcul ont approximativement décuplé tous les cinq ans. Toutefois, les améliorations technologiques successives n’ont que peu modifié l’organisation interne des processeurs.Schématiquement, on peut dire que l’architecture de von Neumann est composée d’un processeur et d’une mémoire. Le processeur exécute un programme contenu dans la mémoire, le programme utilise des données situées dans cette même mémoire. Il est aisé de voir que, dans une telle organisation, les performances de la mémoire conditionnent les performances du système tout entier, puisque toutes les informations transitent par elle. Les techniques décrites ci-après ont donc été développées pour améliorer les performances de la mémoire et pour introduire un parallélisme plus ou moins important dans l’exécution des instructions. Ces techniques peuvent se combiner entre elles dans un même ordinateur, afin d’en augmenter les performances, sans pour cela modifier la durée du cycle de base du processeur.Notion de cache mémoireUn cache mémoire ou cache est une mémoire possédant un temps d’accès proche du cycle de base du processeur mais dont la taille est petite par rapport à celle de la mémoire principale. Un cache contient la copie d’une portion de la mémoire principale; un processeur peut utiliser un cache pour les instructions (cache instructions ) et un cache pour les données (cache données ), les deux caches fonctionnant selon les mêmes principes.Le processeur cherche d’abord dans le cache instructions celle qu’il doit exécuter. Il obtient et exécute immédiatement cette instruction si elle se trouve dans le cache. Sinon, le processeur déclenche une lecture en mémoire principale avant de pouvoir l’exécuter. La lecture en mémoire principale provoque le chargement dans le cache d’une zone mémoire contenant l’instruction.Le gain en performances apporté par un cache résulte du principe de localité: on a montré que, pour la plupart des programmes, 90 p. 100 du temps d’exécution est utilisé pour exécuter seulement 10 p. 100 des instructions. Cela signifie que certaines portions d’un programme sont très fréquemment exécutées. Les performances du processeur sont fortement améliorées lorsque les portions de programme fréquemment exécutées sont présentes dans le cache.Notion de pipelineLe principe du pipeline est connu depuis longtemps en informatique, puisqu’il a été utilisé sur les premiers ordinateurs scientifiques. Nous avons vu plus haut que l’exécution d’une instruction passe par plusieurs étapes, exécutées séquentiellement:– transfert de l’instruction à exécuter depuis la mémoire centrale jusqu’au registre instruction et mise à jour du compteur ordinal ;– décodage de l’instruction;– exécution de l’instruction proprement dite.Si l’on suppose que les étapes sont de durées égales et que chaque étape est réalisée par un opérateur distinct, l’ensemble des trois opérateurs forme un pipeline à trois étages. Chaque opérateur correspond à un étage du pipeline, et la figure 5 illustre le principe de fonctionnement d’un tel pipeline. Nous voyons qu’à un instant donné plusieurs instructions sont simultanément en cours d’exécution, dans des étapes différentes, tout comme les voitures sur la chaîne de montage sont dans un état différent à chaque poste de travail. Lorsque le pipeline fonctionne en régime permanent, le processeur termine l’exécution d’une instruction à chaque cycle de base, bien que l’exécution de chaque instruction dure trois cycles.La conception d’un pipeline est délicate et résulte d’un compromis entre le nombre d’étages qui le compose et la manière dont l’exécution des instructions est décomposée en sous-opérations indépendantes.Les machines RISCLes machines microprogrammées des années 1970 offraient des jeux d’instructions très sophistiqués. Au début des années 1980, de nouvelles architectures, les machines RISC (Reduced Instruction Set Computers), ont été conçues de façon à réduire les temps de conception des machines et pour simplifier l’écriture des compilateurs. Par contraste, les machines dotées d’un jeu d’instructions complexe ont été appelées des machines CISC (Complex Instruction Set Computers).Les architectures RISC se caractérisent par un jeu d’instructions limité aux opérations interregistres et aux transferts entre la mémoire et les registres, par l’utilisation de caches mémoires et de pipelines et par un grand nombre de registres. Les instructions sont de longueur fixe pour favoriser l’achèvement de l’exécution d’une instruction à chaque cycle.Actuellement, les machines RISC et les machines CISC cohabitent, et aucun des deux types d’architectures n’a réellement supplanté l’autre.Les machines vectorielles et les techniques de vectorisationLes machines scientifiques très puissantes, conçues pour travailler efficacement sur les vecteurs, possèdent des unités fonctionnelles permettant d’effectuer une même opération (par exemple, une addition), sur un grand nombre de données (les composantes des deux vecteurs à additionner). Il suffit donc de préciser l’opération à effectuer et sur quelles données opérer pour que l’unité fonctionnelle exécute seule l’opération sur toutes les composantes des vecteurs à traiter. Les unités fonctionnelles peuvent être soit spécialisées, c’est-à-dire qu’elles ne peuvent exécuter qu’un type d’opération donné (par exemple, une addition en virgule flottante), soit générales et dans ce cas elles sont susceptibles d’exécuter diverses fonctions d’évaluation (aussi bien une addition qu’une multiplication ou une division).La présence de ce type d’unités fonctionnelles améliore considérablement la puissance de traitement, mais les performances de la machine dépendent beaucoup de la façon de la programmer. Lorsque l’unité fonctionnelle comporte un pipeline, elle sera d’autant plus efficace que ses temps de chargement et de déchargement seront négligeables devant la durée de l’opération sur les données, c’est-à-dire lorsque celle-ci porte sur des vecteurs longs.La vectorisation est une méthode de programmation qui permet d’utiliser le plus efficacement possible les dispositifs existant dans les machines vectorielles. Certains ont en effet évalué que les rapports de vitesses dans une machine vectorielle entre un programme bien écrit et un programme mal écrit pouvaient aller de 1 à 100! Cela montre l’intérêt des techniques algorithmiques qui conduisent à une écriture des programmes et à des représentations de données complètement différentes des techniques habituellement employées dans les machines classiques. À la limite, il faudrait entièrement réécrire les programmes anciens pour exploiter pleinement les performances des machines vectorielles. Pour éviter un tel gaspillage de logiciels, des compilateurs vectoriseurs transforment les anciens programmes en programmes exécutables sur les nouvelles machines; les compilateurs optimiseurs peuvent également aider le programmeur peu habitué aux techniques de vectorisation. La vectorisation automatique ainsi obtenue ne peut prétendre rivaliser avec les meilleurs programmes écrits spécialement en fonction de la machine sur laquelle le programme est exécuté, mais elle représente une solution de compromis, qui permet l’utilisation des programmes scientifiques très complexes ou très volumineux, écrits pour des machines scalaires (machines ne disposant pas de ressources matérielles spéciales pour le traitement des vecteurs).Les machines superscalairesSi les machines RISC ont été conçues pour permettre l’exécution d’une instruction par cycle de base, les processeurs superscalaires visent l’objectif encore plus ambitieux d’exécuter plusieurs instructions par cycle.Pour cela, ces processeurs sont dotés de plusieurs opérateurs arithmétiques pipelinés, chacun d’eux spécialisés dans l’exécution d’un type d’opération (addition de nombres entiers, multiplication de nombres entiers, addition de nombres en virgule flottante, multiplication de nombres en virgule flottante, etc.). Il faut donc acquérir et décoder simultanément plusieurs instructions, afin de lancer leur exécution en parallèle sur les différentes unités. Bien entendu, ce type de machine possède des caches pour permettre au processeur de travailler au maximum de ses possibilités.L’efficacité d’un processeur superscalaire dépend étroitement du contenu du programme, puisqu’il faut pouvoir alimenter correctement les opérateurs, afin d’exploiter pleinement leurs structures pipelinées (par exemple, le programme doit posséder en nombre suffisant des instructions faisant appel aux différents opérateurs disponibles). Il faut donc disposer de compilateurs réorganisant la séquence d’instructions de façon à exploiter au mieux les ressources matérielles.Les architectures systoliquesLes processeurs systoliques sont des systèmes spécialisés à hautes performances, plus particulièrement employés dans le traitement d’images ou le traitement du signal. Leur structure particulière, spécifique d’un problème à traiter, permet de pouvoir utiliser une même donnée un grand nombre de fois. De ce fait, elles sont particulièrement bien adaptées aux problèmes exigeant de nombreux calculs sur une même donnée (transformées de Fourier, produits de convolution). Comme la plupart des systèmes spécialisés, les architectures systoliques reçoivent leurs données et envoient leurs résultats à un ordinateur hôte. Dans une telle architecture, l’information circule dans de multiples processeurs élémentaires: les données partent de la mémoire pour traverser de nombreux processeurs élémentaires avant de retourner en mémoire, un peu comme le sang part du cœur et y revient après avoir circulé dans le corps. La figure 6 présente le schéma d’une machine monoprocesseur classique et le principe de fonctionnement des architectures systoliques, dans lesquelles l’information passe dans les processeurs élémentaires avant de retourner en mémoire.Une architecture systolique peut être considérée comme un ensemble de cellules interconnectées – les processeurs élémentaires –, chaque cellule pouvant effectuer un petit nombre d’opérations simples. Les différentes cellules sont généralement interconnectées en tableaux ou en arbres, comme le montre la figure 7.Les architectures systoliques se décomposent en un faible nombre de structures simples, connectées par des interfaces simples et utilisées de façon répétitive. Elles se prêtent donc bien aux exigences de réalisation des circuits VLSI et permettent d’envisager des coûts de construction assez bas. De plus, ces architectures étant modulaires, elles sont aisément adaptables à différentes classes de problèmes ou à différents hôtes. Elles peuvent, en outre, se reconfigurer aisément.Parmi les caractéristiques qui rendent ces architectures intéressantes à employer, citons:– le fait qu’une même donnée peut être utilisée un grand nombre de fois dans une machine systolique; cette propriété autorise de gros débits de calcul, même si la cadence des entrées-sorties reste assez modeste;– une exploitation réelle des possibilités d’exécution en parallèle sur un grand nombre de processeurs; en effet, la puissance de traitement des architectures systoliques provient du fait qu’on emploie de nombreuses cellules simples fonctionnant simultanément, au lieu de se servir d’un petit nombre de processeurs qui déroulent séquentiellement un programme donné;– une très grande modularité des structures résultantes; l’utilisation systématique de cellules de traitement simples et identiques rend la structure retenue aisément extensible;– une possibilité d’obtenir des temps de réponse constants; certaines structures systoliques peuvent assurer un recouvrement complet entre les entrées-sorties et les temps de traitement; elles garantissent ainsi un temps de réponse constant du système.Pour une même application, plusieurs solutions systoliques peuvent être trouvées; le choix de la solution retenue dépendra finalement du critère de réalisation choisi (faible coût de réalisation, débit de données maximal, intégration dans un circuit VLSI, etc.). Les architectures systoliques peuvent être employées chaque fois que des calculs répétitifs doivent être exécutés sur un grand nombre de données. Ces structures, encore récentes, représentent une solution originale pour l’exécution de certaines classes d’algorithmes complexes qui nécessitent des temps de calculs importants dans les ordinateurs classiques, pourvu que ces algorithmes puissent se décomposer en opérations simples.4. Classification des architectures de machinesPour caractériser les différentes machines, la classification la plus connue et la plus employée est celle de Michael J. Flynn. Paradoxalement, cette classification n’est pas fondée sur la structure des ordinateurs mais sur la manière dont ceux-ci relient leurs flots d’instructions (instruction stream ) aux flots des données à traiter (data stream ).Bien qu’imparfaite, cette classification permet de répertorier rapidement les différentes architectures. Quatre classes de machines ont ainsi été mises en évidence:– les machines SISD (Single Instruction Stream, Single Data Stream);– les machines SIMD (Single Instruction Stream, Multiple Data Stream);– les machines MISD (Multiple Instructions Stream, Single Data Stream);– les machines MIMD (Multiple Instructions Stream, Multiple Data Stream).Les machines SISDCette classe regroupe les machines n’ayant qu’un seul processeur. Une instruction définit une seule opération qui n’utilise qu’un seul flot de données dont les différents types (arguments, résultats, etc.) sont reliés logiquement les uns aux autres. La classe SISD regroupe aussi bien les machines avec pipeline que les machines sans pipeline.Les machines SIMDCette catégorie comprend les machines qui ne possèdent qu’un seul flot d’instructions travaillant sur des données séparées. Elle regroupe les machines qui possèdent des instructions vectorielles et les architectures systoliques. Les différentes architectures SIMD conviennent bien au traitement des matrices. Elles sont délicates à programmer, à cause de l’interaction étroite entre l’architecture sous-jacente et la technique de programmation à mettre en œuvre.Les machines MISDCette classe est purement théorique, car on peut difficilement envisager d’exécuter simultanément plusieurs instructions agissant sur la même donnée. Aucune machine existante ne peut se ranger dans cette catégorie.Les machines MIMDDans la classe MIMD, on retrouve les machines qui possèdent plusieurs flots d’instructions, exécutés par plusieurs processeurs, chacun d’eux travaillant sur son propre flot de données. Cette catégorie englobe toutes les machines multi-ordinateurs. Dans cette classe de machines, il est possible d’exploiter au mieux le parallélisme qui existe dans les programmes. En contrepartie, il est difficile de trouver des applications qui se prêtent à une décomposition en tâches élémentaires, permettant de fournir du travail à tous les processeurs.5. Les machines parallèles et les machines massivement parallèlesPour améliorer les performances des ordinateurs, les machines parallèles ont, dès le début de l’informatique, été conçues essentiellement pour les applications scientifiques. On appelle machines massivement parallèles les machines qui possèdent un très grand nombre de processeurs, ce nombre allant d’au moins cent processeurs à quelques dizaines de milliers. Les architectures parallèles peuvent utiliser les techniques décrites plus haut (cf. infra , Les améliorations possibles de l’architecture de von Neumann ).Le fonctionnement de ces machines repose sur le principe que l’on peut décomposer un programme en un ensemble de tâches indépendantes, qui sont exécutées simultanément sur des processeurs différents. Selon la manière dont les processeurs coopèrent au cours du traitement, on distingue les systèmes fortement couplés des systèmes faiblement couplés . Par ailleurs, deux types d’architectures parallèles existent actuellement: les multi-processeurs et les multi-ordinateurs , mais, actuellement, les différences entre les deux types de systèmes tendent à s’estomper. Les multi-processeurs se partagent une mémoire commune, alors que les multi-ordinateurs sont constitués par l’interconnexion de multiples ordinateurs (souvent appelés nœuds ), qui possèdent leurs propres mémoires et, éventuellement, leurs propres unités d’entrées-sorties.Remarquons que, quel que soit le type de machines parallèles employé, les performances dépendent fortement du type d’applications à traiter. En particulier, elles exigent de leurs utilisateurs une très bonne connaissance de l’architecture de la machine pour l’écriture de programmes efficaces. De plus, les problèmes à traiter doivent pouvoir être programmés selon des méthodes particulières, variables d’un système à l’autre, faute de quoi les performances de ces architectures seront tellement dégradées que l’usage des machines parallèles ne se justifient plus.Les systèmes fortement couplésCes systèmes sont caractérisés par une communication interprocesseurs s’effectuant à travers la mémoire commune, partagée entre tous les processeurs. Le débit de la mémoire commune détermine donc les performances du système. De plus, il limite le nombre de processeurs possibles: plus le nombre de processeurs croît, et plus la probabilité de conflits d’accès mémoire (par exemple, la demande simultanée d’une opération mémoire sur le même mot mémoire) augmente également. La simultanéité d’exécution dans le système décroît alors très vite, entraînant des baisses de performances très sensibles. La figure 8 donne le schéma de principe d’un système fortement couplé.Les systèmes faiblement couplésLes systèmes faiblement couplés, eux, ne connaissent pas au même degré les problèmes de conflits d’accès mémoire car, dans de tels systèmes, chaque processeur dispose de périphériques propres et d’une grande mémoire locale, dans laquelle il va chercher instructions et données. Les processeurs communiquent donc plus rarement entre eux, grâce à des messages échangés au moyen d’un dispositif de transfert de messages, spécifique d’un système donné.Les systèmes faiblement couplés peuvent donc être utilisés efficacement chaque fois que les interactions entre tâches sont très faibles. Si les interactions entre tâches nécessitent de nombreux transferts de messages entre processeurs, les performances sont fortement dégradées. La figure 9 représente un système faiblement couplé.Les multi-processeursLes architectures multi-processeurs sont des structures SIMD: il s’agit en fait d’un seul ordinateur comprenant plusieurs processeurs. Ceux-ci peuvent communiquer et coopérer à différents niveaux pour résoudre un problème donné. Les différents processeurs sont dotés de capacités de traitement comparables et se partagent l’accès à des mémoires communes, à des canaux d’entrées-sorties et à des périphériques communs. Les architectures multi-processeurs peuvent être contrôlées par un seul système d’exploitation, qui autorise les interactions, à différents niveaux, entre les processeurs et leurs programmes.Les machines SIMD sont en général raccordées à un ordinateur hôte SISD (le frontal ), qui effectue les opérations séquentielles. Les opérations SIMD sont diffusées à tous les processeurs, chacun possédant son propre jeu de registres et sa propre mémoire locale. Ils utilisent un réseau d’interconnexions pour s’échanger des données. Un réseau d’interconnexions est un dispositif matériel qui permet d’établir une connexion soit entre deux processeurs quelconques, soit entre un processeur et une mémoire commune quelconques.Pour qu’un parallélisme massif soit intéressant à utiliser dans une structure SIMD, il faut disposer de quantités massives de données, qu’on appelle parallélisme de données . La figure 10 illustre le principe de construction d’un système multi-processeur.Les multi-ordinateursL’idée de base des multi-ordinateurs est simple: il s’agit de construire un système MIMD puissant, simplement en interconnectant un grand nombre d’ordinateurs existants. La structure (matériels et logiciels) d’un multi-ordinateur est donc modulable en fonction des besoins du traitement. De tels systèmes peuvent être conçus pour être tolérant aux pannes, c’est-à-dire qu’un système à n ordinateurs peut continuer à fonctionner comme un système à n – 1 ordinateurs, si l’un d’eux est défaillant. Les machines MIMD sont construites soit en interconnectant les processeurs par un bus unique, soit en les reliant par un réseau d’interconnexions. La figure 11 donne le schéma de principe d’un système multi-ordinateurs.Le parallélisme d’exécution des différents ordinateurs est limité par la nécessité de coordonner leurs activités lorsqu’ils opèrent sur des données partagées. La synchronisation des ordinateurs (mécanisme qui permet d’empêcher qu’un ordinateur ne commence à travailler sur une donnée partagée avant qu’un autre n’ait terminé son traitement sur cette même donnée) est d’autant plus délicate à réaliser que le nombre d’ordinateurs est grand. Les contraintes liées à la synchronisation limitent le degré de parallélisme dans l’exécution de l’application distribuée sur les structures MIMD.Le développement de l’informatique s’explique par les progrès technologiques réalisés à un rythme très soutenu depuis plus de quatre décennies. Ces progrès ont permis d’offrir des puissances de calcul et des capacités mémoire sans cesse croissantes, tout en entraînant un abaissement considérable des prix de revient des machines, puisque ce sont désormais les logiciels qui représentent l’investissement le plus lourd dans un système informatique. L’évolution des ordinateurs jusqu’à présent met en évidence une certaine continuité dans les architectures de machines. Cependant, la nécessité de préserver les énormes investissements en logiciels freine la réalisation d’architectures originales. Pour ces raisons, les architectures nouvelles ne pourront s’imposer que si elles apportent un progrès décisif dans la production et la fiabilité des logiciels d’application.
Encyclopédie Universelle. 2012.